// 版权所有2009 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// go:build aix | | darwin | |（js&&wasm）| | |（solaris&&illumos）

package os

import "syscall"

// Pipe返回一对连接的文件；从r中读取写入w的返回字节。
// 它返回文件和错误（如果有）。
func Pipe() (r *File, w *File, err error) {
	var p [2]int

	// 参见/syscall/exec。查看锁的描述。
	syscall.ForkLock.RLock()
	e := syscall.Pipe(p[0:])
	if e != nil {
		syscall.ForkLock.RUnlock()
		return nil, nil, NewSyscallError("pipe", e)
	}
	syscall.CloseOnExec(p[0])
	syscall.CloseOnExec(p[1])
	syscall.ForkLock.RUnlock()

	return newFile(uintptr(p[0]), "|0", kindPipe), newFile(uintptr(p[1]), "|1", kindPipe), nil
}
